package util;

import excessoes.UtilException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.oasis.JROdtExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

/**
 *
 * @author Marcelo Gomes Neto
 */
public class RelatorioUtil 
{
    public static final int RELATORIO_PDF = 1;
    public static final int RELATORIO_EXCEL = 2;
    public static final int RELATORIO_HTML = 3;
    public static final int RELATORIO_PLANILHA_OPEN_OFFICE = 4;

    @SuppressWarnings("unchecked")
    public StreamedContent geraRelatorio(HashMap parametrosRelatorio, String nomeRelatorioJasper, String nomeRelatorioSaida, int tipoRelatorio) throws UtilException 
    {
        StreamedContent arquivoRetorno = null;
        try 
        {
            Connection conexao = this.getConexao();
            String caminhoRelatorio = FacesUtil.getServletContext().getRealPath("/WEB-INF/relatorios");
            String caminhoArquivoJasper = caminhoRelatorio + File.separator + nomeRelatorioJasper + ".jasper";

            @SuppressWarnings("UnusedAssignment")
            String caminhoArquivoRelatorio = null;
            @Deprecated // JRLoader.loadObject has been deprecated
            //JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject(caminhoArquivoJasper);
            JasperReport relatorioJasper = (JasperReport) JRLoader.loadObjectFromFile(caminhoArquivoJasper);
            JasperPrint impressoraJasper = JasperFillManager.fillReport(relatorioJasper, parametrosRelatorio, conexao);
            @SuppressWarnings("UnusedAssignment")
            JRExporter tipoArquivoExportado = null;
            @SuppressWarnings("UnusedAssignment")
            String extensaoArquivoExportado = "";
            @SuppressWarnings("UnusedAssignment")
            File arquivoGerado = null;

            switch (tipoRelatorio) 
            {
                case RelatorioUtil.RELATORIO_PDF :
                    tipoArquivoExportado = new JRPdfExporter();
                    extensaoArquivoExportado = "pdf";
		break;
		case RelatorioUtil.RELATORIO_HTML :
                    tipoArquivoExportado = new JRHtmlExporter();
                    extensaoArquivoExportado = "html";
		break;
		case RelatorioUtil.RELATORIO_EXCEL :
                    tipoArquivoExportado = new JRXlsExporter();
                    extensaoArquivoExportado = "xls";
		break;
		case RelatorioUtil.RELATORIO_PLANILHA_OPEN_OFFICE :
                    tipoArquivoExportado = new JROdtExporter();
                    extensaoArquivoExportado = "ods";
		break;
		default :
                    tipoArquivoExportado = new JRPdfExporter();
                    extensaoArquivoExportado = "pdf";
		break;
            }
            
            caminhoArquivoRelatorio = caminhoRelatorio + File.separator + nomeRelatorioSaida + "." + extensaoArquivoExportado;
            arquivoGerado = new File(caminhoArquivoRelatorio);
            tipoArquivoExportado.setParameter(JRExporterParameter.JASPER_PRINT, impressoraJasper);
            tipoArquivoExportado.setParameter(JRExporterParameter.OUTPUT_FILE, arquivoGerado);
            tipoArquivoExportado.exportReport();
            arquivoGerado.deleteOnExit();

            InputStream conteudoRelatorio = new FileInputStream(arquivoGerado);
            arquivoRetorno = new DefaultStreamedContent(conteudoRelatorio, "application/" + extensaoArquivoExportado, nomeRelatorioSaida + "." + extensaoArquivoExportado);
        } 
        catch (JRException e) {
            throw new UtilException("Não foi possível gerar o relatório: "+e.getMessage());
	} 
        catch (FileNotFoundException e) {
            throw new UtilException("Arquivo do relatório não encontrado: "+e.getMessage());
	}
	return arquivoRetorno;
    }

    private Connection getConexao() throws UtilException 
    {
        Connection conexao = null;
	try 
        {
            Context initContext = new InitialContext();
            Context envContext = (Context) initContext.lookup("java:/comp/env/");
            DataSource ds = (DataSource) envContext.lookup("jdbc/conpagdb");
            conexao = (Connection) ds.getConnection();
	} 
        catch (NamingException e) {
            throw new UtilException("Não foi possível encontrar o nome da conexão do banco.", e);
	} 
        catch (SQLException e) {
            throw new UtilException("Ocorreu um erro de SQL.", e);
	}
	return conexao;
    }
}